import { Injectable } from '@nestjs/common';
import { contains } from 'cheerio';
import { prisma } from 'src/database';
import {
  FlightsAggregateResult,
  MonthlyFlights,
  TotalFlights,
} from 'src/flight/interfaces/flight.interface';

@Injectable()
export class TotalFlightsService {
  // 获取指定日期航班量
  async getFlightsByDate(date: string): Promise<TotalFlights> {
    // 获取一条航班量数据
    try {
      return await prisma.totalFlight.findFirst({
        where: { date },
      });
    } catch (error) {
      // 抛出错误：获取航班量数据失败！
      throw new Error('获取航班量数据失败！');
    }
  }

  // 按月获取航班量
  async getFlightsByMonth(
    year: string,
    month: string,
  ): Promise<FlightsAggregateResult> {
    // 获取指定月份航班总量,以及depart和arrive总量
    try {
      return await prisma.totalFlight.aggregate({
        _sum: {
          total: true,
          pvgDep: true,
          pvgArr: true,
        },
        where: {
          // 获取指定年份和月份的数据
          date: {
            contains: `${year}-${month}`,
          },
        },
      });
    } catch (error) {
      // 抛出错误：获取航班量数据失败！
      throw new Error('获取航班量数据失败！');
    }
  }

  // 添加一条航班总量数据
  async addTotalFlights(total: TotalFlights): Promise<void> {
    try {
      await prisma.totalFlight.create({ data: total });
    } catch (error) {
      // 抛出错误：添加航班量数据失败！
      throw new Error('添加航班量数据失败！');
    }
  }

  async getMonthlyFlightStats(
    year: string,
    startMonth: number,
    endMonth: number,
  ): Promise<Array<MonthlyFlights>> {
    const monthlyStats: Array<MonthlyFlights> = [];

    for (let month = startMonth; month <= endMonth; month++) {
      const monthStr = month.toString().padStart(2, '0'); // 确保月份是两位数格式
      const startDate = `${year}-${monthStr}-01`; // 月份的第一天
      const endDate = `${year}-${monthStr}-${this.getDaysInMonth(year, monthStr)}`; // 月份的最后一天

      try {
        const result = await prisma.totalFlight.aggregate({
          _sum: {
            total: true,
            pvgDep: true,
            pvgArr: true,
          },
          where: {
            date: {
              gte: startDate, // 大于或等于月份的第一天
              lte: endDate, // 小于或等于月份的最后一天
            },
          },
        });

        // 将结果添加到列表中，可能还需要添加月份信息以便识别
        monthlyStats.push({
          month: monthStr,
          total: result._sum.total,
          pvgDep: result._sum.pvgDep,
          pvgArr: result._sum.pvgArr,
        });
      } catch (error) {
        console.error(`获取 ${year}-${monthStr} 月份航班量数据失败！`, error);
        // 可以选择抛出错误或继续处理其他月份
      }
    }

    return monthlyStats;
  }

  // 辅助函数：根据年份和月份获取该月的天数
  getDaysInMonth(year: string, month: string): number {
    return new Date(parseInt(year), parseInt(month), 0).getDate();
  }
}
